package br.requisiteworks.modelo.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.modelo.Cliente;
import br.requisiteworks.modelo.dao.ClienteDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

/**
 * Servico responsavel por executar as operacoes principais do modulo de
 * {@link Cliente}s
 * 
 * @author Mikhail Domanoski
 * @version 1, 07/05/2010
 */
@Service
public class ClienteService {

    /**
     * Log da classe
     */
    private static final Log log = LogFactory.getLog(ClienteService.class);

    @Autowired
    private ClienteDao clienteDao;

    /**
     * Salva um novo {@link Cliente} ao repositorio de dados
     * 
     * @param cliente
     *            o {@link Cliente} a ser adicionado ao repositorio
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a persistencia do
     *             {@link Cliente}
     */
    public void salvarCliente(Cliente cliente) throws ErroBancoDados {
	this.clienteDao.insert(cliente);
	log.info("Cliente adicionado com sucesso: " + cliente);
    }

    /**
     * Atualiza um {@link Cliente} existente no repositorio de dados
     * 
     * @param cliente
     *            o {@link Cliente} a ser atualizado
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a persistencia do
     *             {@link Cliente}
     */
    public void atualizarCliente(Cliente cliente) throws ErroBancoDados {
	this.clienteDao.update(cliente);
	log.info("Cliente atualizado com sucesso: " + cliente);
    }

    /**
     * Busca no repositorio por todos os {@link Cliente}s cadastrados no sistema
     * 
     * @throws ResultadoVazio
     *             Caso nanum {@link Cliente} seja encontrado
     */
    public List<Cliente> listarClientes() throws ResultadoVazio {
	return this.clienteDao.select();
    }

    /**
     * Busca no repositorio um {@link Cliente} cujo numero seja igual ao
     * parametro passado
     * 
     * @param numero
     *            O numero de identificacao do {@link Cliente} no repositorio de
     *            dados
     * @throws ResultadoVazio
     *             Caso um {@link Cliente} nao seja encontrado
     */
    public Cliente carregarCliente(int numero) throws ResultadoVazio {
	return this.clienteDao.select(numero);
    }

    /**
     * Remove do repositorio o {@link Cliente} passado pelo parametro
     * 
     * @param cliente
     *            O {@link Cliente} que sera removido do repositorio de dados
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a transacao
     */
    public void deletaCliente(Cliente cliente) throws ErroBancoDados {
	this.clienteDao.delete(cliente);
	log.info("Cliente apagado com sucesso: " + cliente);
    }

    public List<Cliente> procuraNome(String nome) throws ResultadoVazio {
	return this.clienteDao.select(nome);
    }
}
